In [1]:
import time
import os
import sys
import numpy as np
import matplotlib
matplotlib.use('nbagg')
#from matplotlib import style
#style.use('ggplot')
import matplotlib.pyplot as plt
import astropy.units as u
from astropy import stats
from astropy.io import fits
from mmtwfs.wfs import *
from mmtwfs.zernike import ZernikeVector
from mmtwfs.telescope import MMT
import poppy
In [2]:
%load_ext autoreload
%autoreload 2
In [3]:
sys.path.append("/Users/tim/src/cwfs/python")
%cd /Users/tim/MMT/cwfs/
In [4]:
from lsst.cwfs.instrument import Instrument
from lsst.cwfs.algorithm import Algorithm
from lsst.cwfs.image import Image, readFile
import lsst.cwfs.plots as plots
In [5]:
p1000_set1_files = [
"sog_ff_cal_img_2017.1207.083225.fits",
"sog_ff_cal_img_2017.1207.083329.fits",
"sog_ff_cal_img_2017.1207.083411.fits"
]
m1000_set1_files = [
"sog_ff_cal_img_2017.1207.083508.fits",
"sog_ff_cal_img_2017.1207.083545.fits",
"sog_ff_cal_img_2017.1207.083625.fits"
]
m1000_set2_files = [
"sog_ff_cal_img_2017.1207.083737.fits",
"sog_ff_cal_img_2017.1207.083813.fits",
"sog_ff_cal_img_2017.1207.083848.fits"
]
p1000_set2_files = [
"sog_ff_cal_img_2017.1207.083948.fits",
"sog_ff_cal_img_2017.1207.084024.fits",
"sog_ff_cal_img_2017.1207.084059.fits"
]
In [6]:
p1000_set1_data = []
for f in p1000_set1_files:
hdu = fits.open(f)
data = hdu[1].data
header = hdu[1].header
p1000_set1_data.append(data)
p1000_set1_data = np.array(p1000_set1_data)
p1000_set2_data = []
for f in p1000_set2_files:
hdu = fits.open(f)
data = hdu[1].data
header = hdu[1].header
p1000_set2_data.append(data)
p1000_set2_data = np.array(p1000_set2_data)
m1000_set1_data = []
for f in m1000_set1_files:
hdu = fits.open(f)
data = hdu[1].data
header = hdu[1].header
m1000_set1_data.append(data)
m1000_set1_data = np.array(m1000_set1_data)
m1000_set2_data = []
for f in m1000_set2_files:
hdu = fits.open(f)
data = hdu[1].data
header = hdu[1].header
m1000_set2_data.append(data)
m1000_set2_data = np.array(m1000_set2_data)
In [7]:
plt.imshow(p1000_set2_data[0][253-128:253+128, 296-128:296+128], origin="lower")
plt.show()
In [10]:
size = 90
inner = 15
y, x = np.ogrid[-size:size, -size:size]
mask_in = x*x + y*y <= inner*inner
mask_out = x*x + y*y >= size*size
p1000_set1_med = np.median(p1000_set1_data, axis=0)[260-size:260+size,289-size:289+size]
p1000_set2_med = np.median(p1000_set2_data, axis=0)[260-size:260+size,289-size:289+size]
m1000_set1_med = np.median(m1000_set1_data, axis=0)[260-size:260+size,289-size:289+size]
m1000_set2_med = np.median(m1000_set2_data, axis=0)[260-size:260+size,289-size:289+size]
for im in [p1000_set1_med, p1000_set2_med, m1000_set1_med, m1000_set2_med]:
im -= np.median(im[:,:10])
im[im < 0] = 0.
# im[mask_in] = 0.
#| im[mask_out] = 0.
In [11]:
plt.imshow(p1000_set1_med - m1000_set1_med, origin="lower")
plt.show()
p1000_set2_med.shape
Out[11]:
In [12]:
set1 = p1000_set1_med - m1000_set1_med
set2 = p1000_set2_med - m1000_set2_med
In [13]:
fits.writeto("p1000_s1.fits", p1000_set1_med, overwrite=True)
fits.writeto("p1000_s2.fits", p1000_set2_med, overwrite=True)
fits.writeto("m1000_s1.fits", m1000_set1_med, overwrite=True)
fits.writeto("m1000_s2.fits", m1000_set2_med, overwrite=True)
In [14]:
fieldXY = [0., 0.]
I1 = Image(readFile("p1000_s2.fits"), fieldXY, Image.INTRA)
I2 = Image(readFile("m1000_s2.fits"), fieldXY, Image.EXTRA)
In [15]:
d = fits.open("p1000_s1.fits")[-1].data
Image(d, fieldXY, Image.INTRA)
Out[15]:
In [21]:
fig, ax = plt.subplots()
im = ax.imshow(I1.image, origin='lower', cmap='RdBu')
cbar = fig.colorbar(im)
fig.show()
In [26]:
t = MMT()
pup_mask = t.pupil_mask(size=125)
x, y, cfig = center_pupil(I1.image, pup_mask)
print(int(np.round(x)), int(np.round(y)))
cfig.show()
In [27]:
plt.imshow(pup_mask)
plt.show()
In [14]:
mmt = Instrument('mmto', I1.sizeinPix)
In [15]:
# this is a hack. 0.0 doesn't work, but this will yield annular zernike solution that is very close to circular.
mmt.obscuration = 0.01
In [16]:
algo = Algorithm('exp', mmt, 3)
In [17]:
algo.runIt(mmt, I1, I2, 'onAxis')
In [18]:
print(algo.zer4UpNm)
In [19]:
plots.plotZer(algo.zer4UpNm, 'nm')
In [20]:
zv = ZernikeVector()
zv.from_array(algo.zer4UpNm, modestart=4, normalized=True)
zv.denormalize()
In [21]:
zv
Out[21]:
In [25]:
zv.fringe_bar_chart().show()
In [28]:
plots.plotImage(algo.Wconverge, "Final wavefront", show=False)
In [29]:
I1 = Image(readFile("p1000_s2.fits"), fieldXY, Image.INTRA)
I2 = Image(readFile("m1000_s2.fits"), fieldXY, Image.EXTRA)
algo2 = Algorithm('fft', mmt, 3)
algo2.itr0(mmt, I1, I2, 'onAxis')
In [31]:
plots.plotImage(algo2.S, 'wavefront signal')
In [33]:
plt.close('all')
In [34]:
mmt.offset
Out[34]:
In [43]:
fig, ax = plt.subplots()
In [18]:
plt.imshow(algo.Wconverge, origin="lower")
plt.show()
In [45]:
ax.set_title?
In [5]:
im = fits.open("/Users/tim/MMT/wfsdat/20180209/sog_ff_cal_img_2018.0209.021854.fits")[-1].data
plt.imshow(im, origin='lower')
plt.show()
In [11]:
t = MMT()
pup_mask = t.pupil_mask(size=120)
x, y, f = center_pupil(im, pup_mask, threshold=0.8)
In [12]:
x, y
Out[12]:
In [13]:
f.show()
In [ ]: